/*Asmcode (Codename "Adolf Otto Reinhold Windaus")*/
#include "asmcode.h"
#include "interrupt_handler.h"
#include "scheduler.h"

 /* -------------------------------------------------------------------------- */
/* Enables the Interrupt in CPSR			                       */
/* -------------------------------------------------------------------------- */
.align
.global enableCPSR
.equ IBIT, 0x80
enableCPSR:     
  stmfd sp!, {r7,lr}            	@push r7 to stack 
  MRS R7,CPSR				@Read cpsr Register 
  BIC R7,R7,#IBIT			@Sets Enable Bit to zero
  MSR CPSR,R7
  ldmfd sp!, {r7,lr}           		@pop r7 from stack
  mov   pc,lr              		@return

.align  
.global initIRQStack
.equ IRQMODE, 0x12
.equ SVRMODE, 0x10
DELETE:  .word 0xFFFFFFE0 		@überschreiben der Modusbits
IRQMODE: .word 0x00000012	
SVRMODE: .word 0x00000013

initIRQStack:
	STMFD SP!, {R5-R8,LR}         	@push r7 to stack

 	MRS R7,CPSR			@CPSR nach R7 laden
 	MRS R5,CPSR			@CPSR nach R5 sichern
 	LDR R6,DELETE			@DELETE-Maske nach R6 laden
 	AND R7,R7,R6			@5 Mode-Bits löschen
 	LDR R6,IRQMODE			@IRQMODE-Maske nach R6 laden
 	ORR R7,R7,R6			@IRQMODE-Bits setzen
	MSR CPSR,R7			@R7 nach CPSR setzen

   	MOV R13,R0			@Übergebenen Stackpointer ins IRQ-Statusregister (R13) schreiben
 
 	MRS R7,CPSR			@CPSR nach R7 laden
 	LDR R6,DELETE			@DELETE-Maske nach R6 laden
 	AND R7,R7,R6			@5 Mode-Bits löschen
 	LDR R6,SVRMODE			@SVRMODE-Maske nach R6 laden
 	ORR R7,R7,R6			@SVRMODE-Bits setzen
 	MSR CPSR,R7			@R7 nach CPSR setzen
 
	
	LDMFD SP!, {R5-R8,LR}    	@pop r7 from stack
	MOV PC,LR              		@return


.align
.global timeHandler
.equ IBIT, 0x80
timeHandler:	
	STMFD SP!, {LR}			@Sichern des PCs des beendeten Prozesses
	STMFD SP!, {R0-R14}^		@alle Register sichern
	MRS   R1, SPSR			@SPSR sicher
	STMFD SP!, {R1}			@SPSR auf Stack schreiben
	MOV R0, SP
	BL roundRobin			@verändert LR für alten Prozess und speichert und ändert den Stack in neuen PCB
	LDMFD SP!, {R1}
	MSR SPSR, R1			@schreibt SPSR des jetzt startenden Prozesses 
	LDMFD SP!, {R0-R14}^		@Lade in banked Register
	MOV R0,R0			@NOOP
	LDMFD SP!, {R15}^ 		@Rücksprung ins neue Programm
	
.align
.global yield
yield:
	SWI				@Softwareinterrupt auslösen
	
	